Aller au contenu principal

Récapitulatif : les compromis du multithread

Maintenant qu'on a vu le parallélisme et le multithread, voici les compromis à garder en tête pour faire les bons choix.

stream() vs parallelStream()

stream()parallelStream()
OverheadAucunCréation/fusion des threads
Efficace siOpérations légères ou petits volumesOpérations CPU-intensives sur gros volumes
Thread-safe requisNonOui
RisquesAucunRace conditions si état partagé

parallelStream() n'est pas automatiquement plus rapide — il faut que le travail par élément soit suffisamment coûteux pour amortir l'overhead de coordination.

.parallel() vs .parallelStream()

Sur quoi c'est appeléExemple
.parallelStream()Une Collection (List, Set...)list.parallelStream()
.parallel()Un Stream déjà existantIntStream.range(0, 1000).parallel()

Le comportement final est identique dans les deux cas.

Synchronisé vs Non-synchronisé

SynchroniséNon-synchronisé
Thread-safeOuiNon
PerformanceDégradée (verrous)Maximale
RisquesDeadlock possibleRace conditions

La synchronisation protège les données partagées mais a un coût en performance. L'objectif est de synchroniser le minimum nécessaire.

Problèmes liés au multithread

ProblèmeDescriptionSymptôme
Race conditionDeux threads modifient la même donnée en même tempsRésultats imprévisibles ou incorrects
DeadlockDeux threads s'attendent mutuellementProgramme gelé, ne termine jamais
LivelockDeux threads se cèdent la place en boucleProgramme actif mais ne progresse pas
StarvationUn thread n'obtient jamais le verrouUn thread ne s'exécute presque jamais

La loi d'Amdahl

L'amélioration maximale apportée par le parallélisme est limitée par la partie séquentielle du programme.

  • Si 90 % du code est parallélisable et 10 % est séquentiel → gain maximal théorique : ×10, peu importe le nombre de cœurs.
  • Plus la partie séquentielle est grande, moins le parallélisme est utile.

En résumé : quoi choisir?

SituationRecommandation
Traitement indépendant, CPU-intensif, gros volumeparallelStream()
État partagé entre threadssynchronized
Plusieurs verrous dans un même programmeToujours les acquérir dans le même ordre
Données partagées en lecture seulementImmutabilité (aucune synchronisation nécessaire)